package main

import "fmt"

//本质是一个指针
type Animal interface {
	Sleep()
	GetColor() string
	GetType() string
}

//具体类
type Cat struct {
	// Animal
	color string
}

func (this *Cat) Sleep() {
	fmt.Println("Cat is Sleep")
}

func (this *Cat) GetColor() string {
	return this.color
}

func (this *Cat) GetType() string {
	return "Cat"
}

//具体类
type Dog struct {
	// Animal
	color string
}

func (this *Dog) Sleep() {
	fmt.Println("Dog is Sleep")
}

func (this *Dog) GetColor() string {
	return this.color
}

func (this *Dog) GetType() string {
	return "Dog"
}

func showAnimal(animal Animal) {
	animal.Sleep()
	fmt.Println("color = ", animal.GetColor())
	fmt.Println("kind = ", animal.GetType())
}

func main() {

	//多态要素: 1、有父类(接口) 2、有子类（实现父类全部接口方法）3、父类类型变量指向引用子类的具体数据类型变量

	//实现多态 方式一
	// var animal Animal //接口的数据类型，父类指针

	// animal = &Cat{"Green"}
	// animal.Sleep()

	// animal = &Dog{"Yellow"}
	// animal.Sleep()

	//实现多态 方式二
	cat := Cat{"Green"}
	dog := Dog{"Yellow"}

	showAnimal(&cat)
	showAnimal(&dog)
}
